#!/usr/bin/env python3
"""
同步超级管理员菜单权限脚本
确保超级管理员(role_id=1)拥有所有菜单的访问权限
"""

from app import create_app, db
from app.models.menu import Menu
from app.models.role import Role, RoleMenu

def sync_admin_menus():
    """同步超级管理员的菜单权限"""
    app = create_app()
    
    with app.app_context():
        # 获取超级管理员角色(通常是ID=1)
        super_admin_role = Role.query.get(1)
        
        if not super_admin_role:
            print("未找到超级管理员角色(ID=1)")
            return
        
        print(f"找到超级管理员角色: {super_admin_role.name}")
        
        # 获取所有菜单
        all_menus = Menu.query.filter_by(status=True).all()
        all_menu_ids = [menu.id for menu in all_menus]
        
        print(f"数据库中共有 {len(all_menu_ids)} 个有效菜单: {all_menu_ids}")
        
        # 获取当前超级管理员已有的菜单权限
        existing_role_menus = RoleMenu.query.filter_by(role_id=1).all()
        existing_menu_ids = [rm.menu_id for rm in existing_role_menus]
        
        print(f"超级管理员当前有 {len(existing_menu_ids)} 个菜单权限: {existing_menu_ids}")
        
        # 找出缺失的菜单权限
        missing_menu_ids = set(all_menu_ids) - set(existing_menu_ids)
        
        if missing_menu_ids:
            print(f"需要添加的菜单权限: {list(missing_menu_ids)}")
            
            # 添加缺失的菜单权限
            for menu_id in missing_menu_ids:
                role_menu = RoleMenu(role_id=1, menu_id=menu_id)
                db.session.add(role_menu)
                print(f"  添加菜单权限: menu_id={menu_id}")
            
            db.session.commit()
            print("菜单权限同步完成！")
        else:
            print("超级管理员已拥有所有菜单权限，无需同步")
        
        # 验证同步结果
        print("\n=== 同步后的权限验证 ===")
        final_role_menus = RoleMenu.query.filter_by(role_id=1).all()
        final_menu_ids = [rm.menu_id for rm in final_role_menus]
        
        print(f"超级管理员最终拥有 {len(final_menu_ids)} 个菜单权限: {sorted(final_menu_ids)}")
        
        # 显示具体的菜单名称
        print("\n具体菜单列表:")
        for menu_id in sorted(final_menu_ids):
            menu = Menu.query.get(menu_id)
            if menu:
                print(f"  ID:{menu_id} - {menu.name} ({menu.path})")

if __name__ == "__main__":
    sync_admin_menus() 